Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

-1

378
Visualizações
Node.js: Sondeo largo con EventEmitter y Express 4.x | Cierre de solicitud de captura

Estoy sondeando largamente la ruta node.js con la solicitud ajax de JQuery (xhr). Esto envía una solicitud GET a mi servidor Express y escucha los eventos del bus de mensajes. Estoy configurando un tiempo de espera en esa solicitud GET (ya que mi proxy eliminaría las solicitudes largas). Entonces, después del tiempo de espera, el cliente debe enviar un evento de cancelación al servidor.

Quiero capturar ese evento de cancelación/cierre/finalización y eliminar el oyente/suscriptor del bus de mensajes relevante.

Pero lucho. Probé req.on("close"..) y el módulo npm terminado, pero eso no funcionó para mí. Tampoco soy mucho más inteligente después de leer la documentación http del nodo: https://nodejs.org/api/http.html .

¿Alguna idea de cómo hacer frente a esta bestia? ¿O mejores formas de eliminar a los oyentes para evitar pérdidas de memoria?

Elementos esenciales del lado del servidor:

 // server.js var express = require("express"); var EventEmitter = require("events").EventEmitter; var messageBus = new EventEmitter(); messageBus.setMaxListeners(20); var REST_PORT = (process.env.PORT || 5000); var app = express(); app.get("/events", (req, res) => { var listener = function(res) { messageBus.once("message", function(data) { res.status(200).json(data); }); }; req.on("abort", function() { //I tried also "aborted", "close", "closed", "finish", "finished"..no luck messageBus.removeListener("message", listener); }); listener(res); console.log("Total listeners to 'message' events:", messageBus.listeners("message").length); }); // other messageBus.emit logic .. app.listen(REST_PORT, () => { console.log("Application ready on port " + REST_PORT); });

Elementos esenciales del lado del cliente:

 //client.js $.ajax({ method: "GET", async: true, url: "/events", success: function(data) { callback(data); }, complete: function(request, status, err) { if (status == "timeout" || status == "success") { console.log("LOG: Normal long-polling timeout or successful poll, continuing."); longPoll(); } else { console.warn("WARN: Server probably offline, retrying in 2 sec."); setTimeout(function() { longPoll(); }, 2000); } }, timeout: 30000 });

¡Gracias!

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Si esto ayuda a alguien, finalmente decidí implementar el sondeo largo de manera diferente y eliminar la solicitud del cliente en el lado del servidor después de cierto tiempo de espera. Esto me funciona muy bien y, después de reflexionar, es probablemente un mejor mecanismo que confiar en que el cliente cierre las solicitudes correctamente.

 setTimeout(() => { if (!responded) { messageBus.removeListener("message", listener); res.status(204).end(); } }, 30000);
over 4 years ago · Santiago Trujillo Relatório

0

Recomiendo abortar su sistema de sondeo largo personalizado por completo y usar uno de los sistemas de mensajería/tipo socket existentes. Hay muchos que están completamente formados. socket.io sigue siendo el más popular y funciona bien, pero algunas alternativas como estas podrían ser mejores https://www.reddit.com/r/node/comments/4ktqae/socketio_alternatives/

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda